/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "布局描述.h"

using namespace std;



VkDescriptorSetLayoutBinding f_创建阶段着色布局绑定描述(VkDevice& dev, uint32 绑定位置, uint32 参数成员数量,
														const VkDescriptorType 着色器参数类型,
														const VkShaderStageFlagBits 着色阶段)
{
	VkDescriptorSetLayoutBinding 布局绑定 = {};
	布局绑定.binding = 绑定位置;
	布局绑定.descriptorType = 着色器参数类型;
	布局绑定.descriptorCount = 参数成员数量;
	布局绑定.stageFlags = 着色阶段;
	布局绑定.pImmutableSamplers = NULL;


	//"layout(set = M, binding = N) uniform sampler2D variableNameArray[I];"
	// M表示管线布局中的 pSetLayouts
	// N表示M的描述符集合布局中的pBindings
	// I表示N的描述符集合中描述符的索引

	return 布局绑定;
}

VkDescriptorSetLayout f_vk_创建着色器参数布局设置(VkDevice& dev, vector<VkDescriptorSetLayoutBinding>& 绑定描述) {

	VkDescriptorSetLayoutCreateInfo 布局创建信息 = {};
	布局创建信息.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
	布局创建信息.pNext = NULL;
	布局创建信息.bindingCount = 绑定描述.size();
	布局创建信息.pBindings = 绑定描述.data();

	VkDescriptorSetLayout GPU资源布局设置;
	if (vkCreateDescriptorSetLayout(dev, &布局创建信息, nullptr, &GPU资源布局设置) != VK_SUCCESS) {
		throw std::runtime_error("创建 GPU参数资源布局失败");
	}

	return GPU资源布局设置;
}

VkPipelineLayout f_vk_创建线管布局(VkDevice& dev, vector<VkDescriptorSetLayout>& GPU资源布局描述) {
	VkPipelineLayoutCreateInfo 线管布局创建信息 = {};
	线管布局创建信息.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
	线管布局创建信息.pNext = NULL;
	线管布局创建信息.pushConstantRangeCount = 0;
	线管布局创建信息.pPushConstantRanges = nullptr;
	线管布局创建信息.setLayoutCount = GPU资源布局描述.size();
	线管布局创建信息.pSetLayouts = GPU资源布局描述.data();

	VkPipelineLayout 线管布局;
	if (vkCreatePipelineLayout(dev, &线管布局创建信息, NULL, &线管布局) != VK_SUCCESS) {
		throw std::runtime_error("创建线管布局失败");
	}

	return 线管布局;
}

void f_vk_销毁线管步进(VkDevice& dev) {
	
}




void f_创建描述集合(VkDevice& dev) {
	VkDescriptorPool 描述池;

	VkDescriptorPoolSize 描述池大小[1];

	VkDescriptorPoolCreateInfo 描述池创建信息 = {};

	VkResult res = vkCreateDescriptorPool(dev, &描述池创建信息, NULL, &描述池);

}

void f_分配描述集合(VkDevice& dev) {
	VkDescriptorSet 描述设置;

	VkDescriptorSetAllocateInfo 描述集合分配信息[1];

	VkResult res = vkAllocateDescriptorSets(dev, 描述集合分配信息, &描述设置);

}

/*VkDescriptorSetLayout f_创建着色程序参数布局(vector<S_着色参数布局创建参数> 参数, VkDevice& dev) {
	vector<VkDescriptorSetLayoutBinding> 布局绑定设置;
	for (const auto& e : 参数) {
		auto lb = f_创建阶段着色布局绑定描述(dev, e.绑定位置, e.数组数量, (VkDescriptorType)e.GPU参数类型, (VkShaderStageFlagBits)e.着色阶段);
		布局绑定设置.push_back(lb);
	}

	return f_vk_创建着色器参数布局设置(dev, 布局绑定设置);
}*/



